λΆλͺ¨ μμ μ νμ νλλ₯Ό λ°κΎΈλ CSS :has() μ νμλ₯Ό νμν΄ λ³΄μΈμ. μ€μ©μ μΈ μ μ© μ¬λ‘, λΈλΌμ°μ νΈνμ±, κ³ κΈ κΈ°μ μ λ°°μ CSS μ€νμΌλ§μ νμ νμΈμ.
CSS :has() μ νμ λ§μ€ν°νκΈ°: κ°λ ₯ν λΆλͺ¨ μμ μ ν κΈ°λ₯ νμ©
μλ
κ° CSS κ°λ°μλ€μ μμ μμλ₯Ό κΈ°λ°μΌλ‘ λΆλͺ¨ μμλ₯Ό μ νν μ μλ κ°λ¨νκ³ ν¨κ³Όμ μΈ λ°©λ²μ κ°λ§ν΄μμ΅λλ€. μ΄μ κ·Έ κΈ°λ€λ¦Όμ΄ λλ¬μ΅λλ€! :has()
μμ¬ ν΄λμ€κ° λλμ΄ λ±μ₯νμ¬ μ°λ¦¬κ° CSSλ₯Ό μμ±νλ λ°©μμ νμ νκ³ μμ΅λλ€. μ΄ κ°λ ₯ν μ νμλ₯Ό μ¬μ©νλ©΄ νΉμ μμ μμλ₯Ό ν¬ν¨νλ λΆλͺ¨ μμλ₯Ό νκ²ν
ν μ μμ΄, λμ μ΄κ³ λ°μμ μΈ μ€νμΌλ§μ 무νν κ°λ₯μ±μ μ΄μ΄μ€λλ€.
:has() μ νμλ 무μμΈκ°?
:has()
μμ¬ ν΄λμ€λ μ νμ λͺ©λ‘μ μΈμλ‘ λ°λ CSS κ΄κ³ν μμ¬ ν΄λμ€μ
λλ€. μ΄ μ νμ λͺ©λ‘μ μ νμ μ€ νλλΌλ ν΄λΉ μμμ νμ μμ μ€ νλ μ΄μκ³Ό μΌμΉνλ©΄ κ·Έ μμλ₯Ό μ νν©λλ€. κ°λ¨ν λ§ν΄, λΆλͺ¨ μμκ° νΉμ μμμ κ°μ§κ³ μλμ§(has) νμΈνκ³ , λ§μ½ κ·Έλ λ€λ©΄ κ·Έ λΆλͺ¨ μμκ° μ νλ©λλ€.
κΈ°λ³Έ ꡬ문μ λ€μκ³Ό κ°μ΅λλ€:
parent:has(child) { /* CSS κ·μΉ */ }
μ΄λ parent
μμκ° νλ μ΄μμ child
μμλ₯Ό ν¬ν¨ν κ²½μ°μλ§ ν΄λΉ parent
μμλ₯Ό μ νν©λλ€.
:has()κ° μ μ€μνκ°?
μ ν΅μ μΌλ‘ CSSλ μμ μμλ₯Ό κΈ°λ°μΌλ‘ λΆλͺ¨ μμλ₯Ό μ ννλ λ₯λ ₯μ νκ³κ° μμμ΅λλ€. μ΄λ¬ν μ μ½ λλ¬Έμ λμ μ€νμΌλ§μ ꡬννκΈ° μν΄ λ³΅μ‘ν JavaScript μ루μ
μ΄λ μ°ν λ°©λ²μ΄ νμν κ²½μ°κ° λ§μμ΅λλ€. :has()
μ νμλ μ΄λ¬ν λ²κ±°λ‘μ΄ λ°©λ²μ νμμ±μ μμ κ³ , λ κΉ¨λνκ³ μ μ§λ³΄μνκΈ° μ¬μ°λ©° μ±λ₯μ΄ μ’μ CSS μ½λλ₯Ό μμ±ν μ μκ² ν΄μ€λλ€.
:has()
κ° νλλ₯Ό λ°κΎΈλ μ΄μ λ λ€μκ³Ό κ°μ΅λλ€:
- κ°μνλ μ€νμΌλ§: μ΄μ μλ JavaScriptκ° νμνλ 볡μ‘ν μ€νμΌλ§ κ·μΉμ μ΄μ μμ CSSλ‘ κ΅¬νν μ μμ΅λλ€.
- ν₯μλ μ μ§λ³΄μμ±: κΉ¨λνκ³ κ°κ²°ν CSS μ½λλ μ΄ν΄, λλ²κΉ , μ μ§λ³΄μκ° λ μ½μ΅λλ€.
- κ°μ λ μ±λ₯: λ€μ΄ν°λΈ CSS μ νμλ₯Ό μ¬μ©νλ κ²μ΄ μΌλ°μ μΌλ‘ JavaScript κΈ°λ° μ루μ μ λΉν΄ λ λμ μ±λ₯μ 보μ λλ€.
- λ λμ μ μ°μ±:
:has()
μ νμλ λμ μ΄κ³ λ°μμ μΈ λμμΈμ λ§λλ λ° λ ν° μ μ°μ±μ μ 곡ν©λλ€.
:has() μ νμμ κΈ°λ³Έ μμ
:has()
μ νμμ κ°λ ₯ν¨μ 보μ¬μ£Όλ λͺ κ°μ§ κ°λ¨ν μμ λΆν° μμνκ² μ΅λλ€.
μμ 1: μ΄λ―Έμ§ μ 무μ λ°λΌ λΆλͺ¨ Div μ€νμΌλ§νκΈ°
<div>
μμκ° <img>
μμλ₯Ό ν¬ν¨ν κ²½μ°μλ§ ν
λ리λ₯Ό μΆκ°νκ³ μΆλ€κ³ κ°μ ν΄ λ΄
μλ€:
div:has(img) {
border: 2px solid blue;
}
μ΄ CSS κ·μΉμ νλ μ΄μμ <img>
μμλ₯Ό ν¬ν¨νλ λͺ¨λ <div>
μ νλμ ν
λ리λ₯Ό μ μ©ν©λλ€.
μμ 2: Span μ 무μ λ°λΌ 리μ€νΈ μμ΄ν μ€νμΌλ§νκΈ°
νλͺ© 리μ€νΈκ° μκ³ , νΉμ ν΄λμ€λ₯Ό κ°μ§ <span>
μμλ₯Ό ν¬ν¨νλ 리μ€νΈ μμ΄ν
μ κ°μ‘°νκ³ μΆλ€κ³ κ°μ ν΄ λ΄
μλ€:
li:has(span.highlight) {
background-color: yellow;
}
μ΄ CSS κ·μΉμ ν΄λμ€κ° "highlight"μΈ <span>
μ ν¬ν¨νλ λͺ¨λ <li>
μ λ°°κ²½μμ λ
ΈλμμΌλ‘ λ³κ²½ν©λλ€.
μμ 3: μ λ ₯ μ ν¨μ±μ λ°λΌ νΌ λ μ΄λΈ μ€νμΌλ§νκΈ°
:has()
λ₯Ό μ¬μ©νμ¬ μ°κ²°λ μ
λ ₯ νλκ° μ ν¨νμ§ λλ μ ν¨νμ§ μμμ§μ λ°λΌ νΌ λ μ΄λΈμ μ€νμΌμ μ§μ ν μ μμ΅λλ€ (:invalid
μμ¬ ν΄λμ€μ κ²°ν©):
label:has(+ input:invalid) {
color: red;
font-weight: bold;
}
μ΄ μ½λλ λ°λ‘ λ€λ°λ₯΄λ μ λ ₯ νλκ° μ ν¨νμ§ μμ κ²½μ° λ μ΄λΈμ λΉ¨κ°μκ³Ό κ΅΅μ κΈμ¨λ‘ λ§λλλ€.
:has() μ νμμ κ³ κΈ νμ©λ²
:has()
μ νμλ λ€λ₯Έ CSS μ νμ λ° μμ¬ ν΄λμ€μ κ²°ν©λ λ λμ± κ°λ ₯ν΄μ§λλ€. λͺ κ°μ§ κ³ κΈ μ¬μ© μ¬λ‘λ λ€μκ³Ό κ°μ΅λλ€:
μμ 4: νΉμ μμμ΄ μλ μμ νκ²ν
:not()
μμ¬ ν΄λμ€λ₯Ό :has()
μ ν¨κ» μ¬μ©νμ¬ νΉμ μμμ *κ°μ§ μλ* μμλ₯Ό νκ²ν
ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, μ΄λ―Έμ§λ₯Ό ν¬ν¨νμ§ *μλ* divμ μ€νμΌμ μ§μ νλ €λ©΄ λ€μκ³Ό κ°μ΄ ν©λλ€:
div:not(:has(img)) {
background-color: #f0f0f0;
}
μ΄ μ½λλ <img>
μμλ₯Ό ν¬ν¨νμ§ μλ λͺ¨λ <div>
μ λ°μ νμ λ°°κ²½μ μ μ©ν©λλ€.
μμ 5: 볡μ‘ν λ μ΄μμ μμ±νκΈ°
:has()
μ νμλ 컨ν
μ΄λμ λ΄μ©μ λ°λΌ λμ λ μ΄μμμ λ§λλ λ° μ¬μ©λ μ μμ΅λλ€. μλ₯Ό λ€μ΄, 그리λ μ
λ΄μ νΉμ μ νμ μμκ° μλμ§ μ¬λΆμ λ°λΌ 그리λμ λ μ΄μμμ λ³κ²½ν μ μμ΅λλ€.
.grid-container {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
.grid-item:has(img) {
grid-column: span 2;
}
μ΄ μ½λλ 그리λ μμ΄ν μ΄ μ΄λ―Έμ§λ₯Ό ν¬ν¨ν κ²½μ° λ κ°μ μ΄μ κ±Έμ³ νμλλλ‘ ν©λλ€.
μμ 6: λμ νΌ μ€νμΌλ§
:has()
λ₯Ό μ¬μ©νμ¬ νΌ μμμ μν(μ: ν¬μ»€μ€, μ±μμ§, μ ν¨ν¨)μ λ°λΌ λμ μΌλ‘ μ€νμΌμ μ§μ ν μ μμ΅λλ€.
.form-group:has(input:focus) {
box-shadow: 0 0 5px rgba(0, 0, 255, 0.5);
}
.form-group:has(input:valid) {
border-color: green;
}
.form-group:has(input:invalid) {
border-color: red;
}
μ΄ μ½λλ μ λ ₯μ΄ ν¬μ»€μ€λ λ νλμ κ·Έλ¦Όμ ν¨κ³Όλ₯Ό μΆκ°νκ³ , μ λ ₯μ΄ μ ν¨νλ©΄ λ Ήμ ν λ리λ₯Ό, μ ν¨νμ§ μμΌλ©΄ λΉ¨κ°μ ν λ리λ₯Ό μΆκ°ν©λλ€.
μμ 7: μμ μμ μμ κΈ°λ°ν μ€νμΌλ§
:has()
κ° μ§μ μ μΌλ‘ μμμ μλ₯Ό μΈμ§λ μμ§λ§, λ€λ₯Έ μ νμ λ° CSS μμ±κ³Ό κ²°ν©νμ¬ μ μ¬ν ν¨κ³Όλ₯Ό μ»μ μ μμ΅λλ€. μλ₯Ό λ€μ΄, :only-child
λ₯Ό μ¬μ©νμ¬ λΆλͺ¨κ° νΉμ μ νμ μμμ νλλ§ κ°μ§ κ²½μ° μ€νμΌμ μ§μ ν μ μμ΅λλ€.
div:has(> p:only-child) {
background-color: lightgreen;
}
μ΄ μ½λλ λ¨μΌ <p>
μμλ₯Ό μ§κ³ μμμΌλ‘ ν¬ν¨νλ <div>
μλ§ μ°λμ λ°°κ²½μ μ μ©ν©λλ€.
ν¬λ‘μ€ λΈλΌμ°μ νΈνμ± λ° ν΄λ°±(Fallbacks)
2023λ
λ§ κΈ°μ€μΌλ‘, :has()
μ νμλ ν¬λ‘¬, νμ΄μ΄νμ€, μ¬ν리, μ£μ§λ₯Ό ν¬ν¨ν μ΅μ λΈλΌμ°μ μμ νλ₯ν μ§μμ λ°κ³ μμ΅λλ€. νμ§λ§, νΉν ꡬν λΈλΌμ°μ λ₯Ό μ§μν΄μΌ νλ κ²½μ° νλ‘λμ
νκ²½μ λ°°ν¬νκΈ° μ μ Can I useμμ νΈνμ±μ νμΈνλ κ²μ΄ μ€μν©λλ€.
νΈνμ± κ³ λ € μ¬νμ λν λΆμμ λ€μκ³Ό κ°μ΅λλ€:
- μ΅μ λΈλΌμ°μ : μ΅μ λ²μ μ ν¬λ‘¬, νμ΄μ΄νμ€, μ¬ν리, μ£μ§μμ νλ₯νκ² μ§μλ©λλ€.
- ꡬν λΈλΌμ°μ : ꡬν λΈλΌμ°μ (μ: μΈν°λ· μ΅μ€νλ‘λ¬)μμλ μ§μλμ§ μμ΅λλ€.
ν΄λ°± μ 곡νκΈ°
ꡬν λΈλΌμ°μ λ₯Ό μ§μν΄μΌ νλ κ²½μ° ν΄λ°±μ μ 곡ν΄μΌ ν©λλ€. λͺ κ°μ§ μ λ΅μ λ€μκ³Ό κ°μ΅λλ€:
- JavaScript: JavaScriptλ₯Ό μ¬μ©νμ¬ λΈλΌμ°μ μ
:has()
μ§μ μ¬λΆλ₯Ό κ°μ§νκ³ νμν κ²½μ° λ체 μ€νμΌμ μ μ©ν©λλ€. - κΈ°λ₯ 쿼리(Feature Queries): CSS κΈ°λ₯ 쿼리(
@supports
)λ₯Ό μ¬μ©νμ¬ λΈλΌμ°μ μ§μμ λ°λΌ λ€λ₯Έ μ€νμΌμ μ 곡ν©λλ€. - μ μ§μ ν₯μ(Progressive Enhancement): λͺ¨λ λΈλΌμ°μ μμ μλνλ κΈ°λ³Έμ μ΄κ³ κΈ°λ₯μ μΈ λμμΈμΌλ‘ μμν λ€μ,
:has()
λ₯Ό μ§μνλ λΈλΌμ°μ λ₯Ό μν΄ λμμΈμ μ μ§μ μΌλ‘ ν₯μμν΅λλ€.
κΈ°λ₯ 쿼리λ₯Ό μ¬μ©νλ μλ λ€μκ³Ό κ°μ΅λλ€:
.parent {
/* λͺ¨λ λΈλΌμ°μ λ₯Ό μν κΈ°λ³Έ μ€νμΌλ§ */
border: 1px solid black;
}
@supports selector(:has(img)) {
.parent:has(img) {
/* :has()λ₯Ό μ§μνλ λΈλΌμ°μ λ₯Ό μν ν₯μλ μ€νμΌλ§ */
border: 3px solid blue;
}
}
μ΄ μ½λλ λͺ¨λ λΈλΌμ°μ μμ .parent
μμμ κ²μμ ν
λ리λ₯Ό μ μ©ν©λλ€. :has()
λ₯Ό μ§μνλ λΈλΌμ°μ μμλ .parent
μμκ° μ΄λ―Έμ§λ₯Ό ν¬ν¨ν κ²½μ° νλμ ν
λ리λ₯Ό μ μ©ν©λλ€.
μ±λ₯ κ³ λ €μ¬ν
:has()
λ μλΉν μ΄μ μ μ 곡νμ§λ§, νΉν κ΄λ²μνκ² μ¬μ©λκ±°λ 볡μ‘ν μ νμμ ν¨κ» μ¬μ©λ λ μ±λ₯μ λ―ΈμΉ μ μλ μ μ¬μ μν₯μ κ³ λ €νλ κ²μ΄ μ€μν©λλ€. λΈλΌμ°μ λ νμ΄μ§μ λͺ¨λ μμμ λν΄ μ νμλ₯Ό νκ°ν΄μΌ νλ―λ‘, μ΄λ μ°μ° λΉμ©μ΄ λ§μ΄ λ€ μ μμ΅λλ€.
:has()
μ μ±λ₯μ μ΅μ ννκΈ° μν λͺ κ°μ§ νμ λ€μκ³Ό κ°μ΅λλ€:
- μ νμλ₯Ό λ¨μνκ² μ μ§νκΈ°:
:has()
μμ¬ ν΄λμ€ λ΄μμ μ§λμΉκ² 볡μ‘ν μ νμλ₯Ό μ¬μ©νμ§ λ§μΈμ. - λ²μ μ ννκΈ°:
:has()
λ₯Ό μ μμ μΌλ‘ μ μ©ν기보λ€λ νΉμ μμλ 컨ν μ΄λμ μ μ©νμΈμ. - μ±λ₯ ν μ€νΈνκΈ°: λΈλΌμ°μ κ°λ°μ λꡬλ₯Ό μ¬μ©νμ¬ CSS κ·μΉμ μ±λ₯μ λͺ¨λν°λ§νκ³ μ μ¬μ μΈ λ³λͺ© νμμ μλ³νμΈμ.
νΌν΄μΌ ν μΌλ°μ μΈ μ€μ
:has()
μ νμλ‘ μμ
ν λ μμμΉ λͺ»ν κ²°κ³Όλ₯Ό μ΄λν μ μλ μ€μλ₯Ό νκΈ° μ½μ΅λλ€. νΌν΄μΌ ν λͺ κ°μ§ μΌλ°μ μΈ ν¨μ μ λ€μκ³Ό κ°μ΅λλ€:
- λͺ
μλ λ¬Έμ :
:has()
κ·μΉμ΄ λ€λ₯Έ CSS κ·μΉμ μ¬μ μν μ μλλ‘ μΆ©λΆν λͺ μλλ₯Ό κ°λλ‘ νμΈμ. νμ μ¬μ©νλ κ²κ³Ό λμΌν λͺ μλ λ¬Έμ ν΄κ²° λ¨κ³λ₯Ό λ°λ₯΄μΈμ. - μλͺ»λ μ€μ²©:
:has()
μ νμκ° μ¬λ°λ₯Έ λΆλͺ¨ μμλ₯Ό νκ²ν νκ³ μλμ§ νμΈνκΈ° μν΄ μμμ μ€μ²© ꡬ쑰λ₯Ό λ€μ νμΈνμΈμ. - μ§λμΉκ² 볡μ‘ν μ νμ:
:has()
μμ¬ ν΄λμ€ λ΄μμ μ§λμΉκ² 볡μ‘ν μ νμλ₯Ό μ¬μ©νλ©΄ μ±λ₯μ μν₯μ μ€ μ μμΌλ―λ‘ νΌνμΈμ. - μ§κ³ μμμΌλ‘ κ°μ νκΈ°:
:has()
λ μ§κ³ μμλΏλ§ μλλΌ *λͺ¨λ * νμ μμλ₯Ό νμΈνλ€λ μ μ κΈ°μ΅νμΈμ. μ§κ³ μμλ§ νκ²ν ν΄μΌ νλ κ²½μ° μ§κ³ μμ κ²°ν©μ(>
)λ₯Ό μ¬μ©νμΈμ (μ:div:has(> img)
).
:has() μ¬μ©μ μν λͺ¨λ² μ¬λ‘
:has()
μ νμμ μ΄μ μ κ·Ήλννκ³ μ μ¬μ μΈ λ¬Έμ λ₯Ό νΌνλ €λ©΄ λ€μ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄μΈμ:
- μ μ€νκ² μ¬μ©νκΈ°: λ€λ₯Έ CSS κΈ°μ μ΄λ JavaScript μ루μ
λ³΄λ€ λͺ
νν μ΄μ μ μ 곡ν λλ§
:has()
λ₯Ό μ¬μ©νμΈμ. - λ¨μνκ² μ μ§νκΈ°: 볡μ‘νκ³ λν΄ν μ νμλ³΄λ€ κ°λ¨νκ³ μ½κΈ° μ¬μ΄ μ νμλ₯Ό μ νΈνμΈμ.
- μ² μ νκ² ν μ€νΈνκΈ°: CSS κ·μΉμ΄ μμλλ‘ μλνλμ§ λ€λ₯Έ λΈλΌμ°μ μ κΈ°κΈ°μμ ν μ€νΈνμΈμ.
- μ½λ λ¬ΈμννκΈ°:
:has()
κ·μΉμ λͺ©μ κ³Ό κΈ°λ₯μ μ€λͺ νκΈ° μν΄ CSS μ½λμ μ£Όμμ μΆκ°νμΈμ. - μ κ·Όμ± κ³ λ €νκΈ°:
:has()
μ¬μ©μ΄ μ κ·Όμ±μ λΆμ μ μΈ μν₯μ λ―ΈμΉμ§ μλλ‘ νμΈμ. μλ₯Ό λ€μ΄, μ€μν μ 보λ₯Ό μ λ¬νκΈ° μν΄:has()
μ μν΄ νΈλ¦¬κ±°λλ μ€νμΌ λ³κ²½μλ§ μμ‘΄νμ§ λ§κ³ , μ₯μ κ° μλ μ¬μ©μλ₯Ό μν΄ ARIA μμ±μ΄λ λ체 λ©μ»€λμ¦μ μ¬μ©νμΈμ.
μ€μ μ¬λ‘ λ° μ¬μ© μμ
:has()
μ νμλ₯Ό μ¬μ©νμ¬ μΌλ°μ μΈ λμμΈ λ¬Έμ λ₯Ό ν΄κ²°νλ λ°©λ²μ λν λͺ κ°μ§ μ€μ μμλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
μμ 8: λ°μν λ΄λΉκ²μ΄μ λ©λ΄ λ§λ€κΈ°
:has()
λ₯Ό μ¬μ©νμ¬ νΉμ λ©λ΄ νλͺ©μ μ 무μ λ°λΌ λ€λ₯Έ νλ©΄ ν¬κΈ°μ μ μνλ λ°μν λ΄λΉκ²μ΄μ
λ©λ΄λ₯Ό λ§λ€ μ μμ΅λλ€.
μ¬μ©μκ° λ‘κ·ΈμΈνλμ§ μ¬λΆμ λ°λΌ λ€λ₯Έ λ΄λΉκ²μ΄μ λ©λ΄λ₯Ό νμνλ €λ μλ리μ€λ₯Ό μμν΄ λ³΄μΈμ. λ‘κ·ΈμΈν κ²½μ° νλ‘ν λ° λ‘κ·Έμμ μμ μ νμν μ μκ³ , κ·Έλ μ§ μμ κ²½μ° λ‘κ·ΈμΈ/νμκ°μ μ νμν μ μμ΅λλ€.
nav:has(.user-profile) {
/* λ‘κ·ΈμΈν μ¬μ©μλ₯Ό μν μ€νμΌ */
}
nav:not(:has(.user-profile)) {
/* λ‘κ·Έμμν μ¬μ©μλ₯Ό μν μ€νμΌ */
}
μμ 9: μΉ΄λ μ»΄ν¬λνΈ μ€νμΌλ§
:has()
μ νμλ λ΄μ©μ λ°λΌ μΉ΄λ μ»΄ν¬λνΈμ μ€νμΌμ μ§μ νλ λ° μ¬μ©λ μ μμ΅λλ€. μλ₯Ό λ€μ΄, μΉ΄λμ μ΄λ―Έμ§κ° ν¬ν¨λ κ²½μ°μλ§ κ·Έλ¦Όμλ₯Ό μΆκ°ν μ μμ΅λλ€.
.card:has(img) {
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}
μμ 10: λμ ν λ§ κ΅¬ν
:has()
λ₯Ό μ¬μ©νμ¬ μ¬μ©μ κΈ°λ³Έ μ€μ μ΄λ μμ€ν
μ€μ μ λ°λΌ λμ ν
λ§λ₯Ό ꡬνν μ μμ΅λλ€. μλ₯Ό λ€μ΄, μ¬μ©μκ° λ€ν¬ λͺ¨λλ₯Ό νμ±ννλμ§ μ¬λΆμ λ°λΌ νμ΄μ§μ λ°°κ²½μμ λ³κ²½ν μ μμ΅λλ€.
body:has(.dark-mode) {
background-color: #333;
color: #fff;
}
μ΄λ¬ν μλ€μ :has()
μ νμμ λ€μμ±κ³Ό κ΄λ²μν λμμΈ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ λ₯λ ₯μ 보μ¬μ€λλ€.
CSSμ λ―Έλ: λ€μμ 무μμΌκΉ?
:has()
μ νμμ λμ
μ CSS λ°μ μ μ€μν ν κ±Έμμ μλ―Έν©λλ€. μ΄λ₯Ό ν΅ν΄ κ°λ°μλ€μ JavaScriptμ λν μμ‘΄λλ₯Ό μ€μ΄λ©΄μ λ λμ μ΄κ³ λ°μμ μ΄λ©° μ μ§λ³΄μνκΈ° μ¬μ΄ μ€νμΌμνΈλ₯Ό λ§λ€ μ μκ² λμμ΅λλ€. :has()
μ λν λΈλΌμ°μ μ§μμ΄ κ³μ μ¦κ°ν¨μ λ°λΌ, μ΄ κ°λ ₯ν μ νμμ λμ± νμ μ μ΄κ³ μ°½μμ μΈ μ¬μ©λ²μ λ³΄κ² λ κ²μΌλ‘ κΈ°λλ©λλ€.
μμΌλ‘ CSS μνΉ κ·Έλ£Ήμ CSSμ κΈ°λ₯μ λμ± νμ₯ν λ€λ₯Έ ν₯λ―Έλ‘μ΄ κΈ°λ₯κ³Ό κ°μ μ¬νμ νμνκ³ μμ΅λλ€. μ¬κΈ°μλ λ€μμ΄ ν¬ν¨λ©λλ€:
- 컨ν μ΄λ 쿼리(Container Queries): λ·°ν¬νΈκ° μλ 컨ν μ΄λμ ν¬κΈ°μ λ°λΌ μ»΄ν¬λνΈκ° μ€νμΌμ μ‘°μ ν μ μλλ‘ ν©λλ€.
- μΊμ€μΌμ΄λ λ μ΄μ΄(Cascade Layers): CSS κ·μΉμ μΊμ€μΌμ΄λ λ° λͺ μλμ λν λ λ§μ μ μ΄κΆμ μ 곡ν©λλ€.
- λ λ§μ κ³ κΈ μ νμ: μμ±, λ΄μ© λ° λ¬Έμ νΈλ¦¬ λ΄ μμΉλ₯Ό κΈ°λ°μΌλ‘ μμλ₯Ό νκ²ν ν μ μλ μλ‘μ΄ μ νμλ₯Ό λμ ν©λλ€.
μ΅μ CSS κ°λ° λν₯μ νμ
νκ³ :has()
μ κ°μ μλ‘μ΄ κΈ°λ₯μ μμ©ν¨μΌλ‘μ¨ κ°λ°μλ€μ CSSμ μ μ¬λ ₯μ μ΅λν λ°ννκ³ μ§μ μΌλ‘ λ°μ΄λ μΉ κ²½νμ λ§λ€ μ μμ΅λλ€.
κ²°λ‘
:has()
μ νμλ CSS ν΄λ°μ€μ μΆκ°λ κ°λ ₯ν κΈ°λ₯μΌλ‘, λΆλͺ¨ μμ μ νμ κ°λ₯νκ² νκ³ λμ μ΄κ³ λ°μμ μΈ μ€νμΌλ§μ μλ‘μ΄ κ°λ₯μ±μ μ΄μ΄μ€λλ€. λΈλΌμ°μ νΈνμ± λ° μ±λ₯ μν₯μ κ³ λ €νλ κ²μ΄ μ€μνμ§λ§, λ κΉ¨λνκ³ μ μ§λ³΄μνκΈ° μ¬μ°λ©° μ±λ₯ μ’μ CSS μ½λλ₯Ό μν΄ :has()
λ₯Ό μ¬μ©νλ μ΄μ μ λΆμΈν μ μμ΅λλ€. μ΄ νλλ₯Ό λ°κΎΈλ μ νμλ₯Ό λ°μλ€μ΄κ³ μ€λ μ¬λ¬λΆμ CSS μ€νμΌλ§μ νμ νμΈμ!
μ κ·Όμ±μ κ³ λ €νκ³ κ΅¬ν λΈλΌμ°μ λ₯Ό μν ν΄λ°± λ©μ»€λμ¦μ μ 곡νλ κ²μ μμ§ λ§μΈμ. μ΄ κ°μ΄λμ μ€λͺ
λ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ :has()
μ νμμ μ μ¬λ ₯μ μ΅λν νμ©νκ³ μ μΈκ³ μ¬μ©μμκ² μ§μ μΌλ‘ λ°μ΄λ μΉ κ²½νμ μ 곡ν μ μμ΅λλ€.